package com.team.game.Game;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.MotionEvent;

import com.team.game.framework.Abstract.GesturesInfo;
import com.team.game.framework.Abstract.Spell;
import com.team.game.framework.Game;
import com.team.game.framework.impl.MainActivity;
import com.team.game.framework.impl.Scale_X_Y;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import static com.team.game.Screens.Upgrade_Screen.icons;
import static com.team.game.framework.impl.Scale_X_Y.scale;

public class Wizard {

    private Game game;

    private boolean[] ActiveSpell = new boolean[5];      //активируем заклинание
    private boolean[] WaitForTapSpell = new boolean[5];  //тру когда нужно подождать пока не будет нажатие

    private String[] NameSpell = new String[8];

    private int WaitNum = 0;
    private GesturesInfo gesturesInfo = new GesturesInfo();
    private RectF WizardRect;
    private Bitmap BackSpell;
    private Rect WizardRectSource = new Rect(0, 0, 48, 48);
    private RectF BackSpellDst = new RectF(0, 0, 90 * scale, 400 * scale);
    public Bitmap Mage;
    private ArrayList<Spell> ArraySpell = new ArrayList<>(8);

    public String MagName;


    public Wizard(Game game) {
        this.game = game;

        WizardRect = new RectF(498 * Scale_X_Y.Scale_X, 1537 * Scale_X_Y.Scale_Y, 582 * Scale_X_Y.Scale_X, 1615 * Scale_X_Y.Scale_Y);


        WizardMaker.makeWizardGame(game, 0, ArraySpell, NameSpell);

        for (int i = 0; i < ArraySpell.size(); i++) {
            ActiveSpell[i] = false;
            WaitForTapSpell[i] = false;
        }

        InputStream inputStream;
        try {

            inputStream = MainActivity.manager.open("Picture/Gestures/FireMage/FireMage.png");
            Mage = BitmapFactory.decodeStream(inputStream);
            inputStream = MainActivity.manager.open("Picture/Gestures/FireMage/back.png");
            BackSpell = BitmapFactory.decodeStream(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Wizard(int numb) {

        MagName = WizardMaker.makeWizardProfile(numb, ArraySpell, Mage);
        icons[0] = new RectF(127 * scale, 636 * scale, 227 * scale, 736 * scale);
        for (int i = 1; i < 8; i++) {
            icons[i] = new RectF(127 * scale, (icons[i - 1].top + 105 * scale), 227 * scale, (icons[i - 1].bottom + 105 * scale));
        }
        InputStream is;
        try {
            is = MainActivity.manager.open("Picture/Gestures/FireMage/icon.png");
            Mage = BitmapFactory.decodeStream(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void drawSpell(Canvas canvas) {

        for (int i = 0; i < ArraySpell.size(); i++) {
            if (ActiveSpell[i]) {
                ArraySpell.get(i).drawSpell(canvas);
            }
        }

        canvas.drawBitmap(BackSpell, null, BackSpellDst, null);
        for (int i = 0; i < ArraySpell.size(); i++)
            ArraySpell.get(i).drawProgressBar(canvas);
        canvas.drawBitmap(Mage, WizardRectSource, WizardRect, null);
    }

    public void updateSpell() {
        for (int i = 0; i < ArraySpell.size(); i++) {
            if (ActiveSpell[i]) {
                ActiveSpell[i] = ArraySpell.get(i).updateSpell();
            }
        }

    }

    public void restart() {
        for (int i = 0; i < ArraySpell.size(); i++) {
            ActiveSpell[i] = false;
            WaitForTapSpell[i] = false;
            ArraySpell.get(i).restart();
        }
    }

    public boolean ActiveSpell(GesturesInfo gestureInfo) {
        this.gesturesInfo = gestureInfo;
        //s = gestureInfo.prediction.name;
        for (int i = 0; i < ArraySpell.size(); i++) {
            if (NameSpell[i].equals(gestureInfo.prediction.name)) {
                if (!ActiveSpell[i]) {
                    WaitNum = i;
                    ActiveSpell[i] = true;
                    return WaitForTapSpell[i] = ArraySpell.get(i).activeSpell(gesturesInfo);  //если возвращаемое заначение тру, то нужно ожидать касания
                }
                break;
            }
        }
        return false;
    }

    public void dispose() {
        for (int i = 0; i < ArraySpell.size(); i++) {
            ArraySpell.get(i).dispose();
        }
    }

    public void drawPath(Canvas canvas, MotionEvent motionEvent) {

        //TODO Сделать красивую анимацию ведения по єкрану
        //как в фрут нинзя))
    }

    public void Tap(MotionEvent motionEvent) {
        if (WaitForTapSpell[WaitNum]) {
            WaitForTapSpell[WaitNum] = ArraySpell.get(WaitNum).setMotionEventSpell(motionEvent);  //если заклинание еще нуждается в тапе, возвращаем волс
            if (!WaitForTapSpell[WaitNum]) // если мы вернули фолс, говорим мэйн активити что оно может дальше проверять заклинания
                game.waitForTap(false);
        }

    }

    public void setAnotherMage() {

    }


    public void updateProfile(int CurrentSpell)
    {
        ArraySpell.get(CurrentSpell).updateProfileExample();
    }
    public void drawProfile (Canvas canvas) {
        //иконки заклинаний
        for (int i = 0; i < 8; i++)
            canvas.drawBitmap (ArraySpell.get (i).icon_spell, null, icons[i], null);
    }

    public void drawSpellProfile (Canvas canvas, int CurrentSpell, int SpellLevel) {

        ArraySpell.get (CurrentSpell).drowProfileExample (canvas , SpellLevel);

    }

    public int getCost (int spell, int level) {
        return ArraySpell.get (spell).cost[level];
    }
}
